III.3.LA MEMOIRE:
III.3.1.REPRESENTATION DES DONNEES:
Dans un ordinateur, les informations sont représentées sous forme DIGITALE BINAIRE. Plus concrètement,
toutes les données (de quelque nature qu'elles soient) sont codées sous la forme de combinaisons
d'entités appelées BITS.
Le mot bit est la contraction de Binary digiT (littéralement: Digit Binaire). Il désigne une entité ne
pouvant prendre que deux états: 0 et 1. Du point de vue technique, un BIT est matérialisé par un système
matériel doté de deux états stables (exemple: circuits électroniques bistables).
Dans un ordinateur, une donnée quelconque est donc toujours représentée sous la forme d'une file de BITS,
chacun de ceux-ci pouvant prendre les états 0 ou 1. La longueur de ces files de bits est toujours un
multiple de 8 (nous verrons plus loin que cette particularité est liée aux modalités d'adressage
des données dans les mémoires). Un groupe de 8 bits est appelé OCTET. Les données occupent donc
toujours un nombre entier d'octets:
EXEMPLES:
Les données numériques nombres entiers ou fractionnaires, signés ou non), peuvent être représentées sur 1,
2, 4 ou 8 octets. Le format de représentation des entiers naturels (non signés) est assez simple: il
reproduit la valeur du nombre représentée en base 2. Ainsi, un nombre de 2 octets est représenté sous
la forme d'une suite de 16 bits ( B15, B14,,..., B0). dont la valeur V est:
Lorsque les nombres sont signés, le bit de plus haut indice représente le signe (0 = +, 1 = -).
Dans l'exemple, ce signe serait représenté par la valeur du bit d'indice 15. La représentation de la valeur
des nombre négatifs et surtout fractionnaire est beaucoup plus compliquée que celle des entiers naturels
et représenterait un trop long développement pour figurer dans cet ouvrage.
III.3.2.ADRESSAGE DES DONNEES:
Les mémoires centrales d'ordinateurs adressent les données par groupes de 8 bits appelés OCTETS. Une adresse
mémoire est le numero d'ordre d'un octet de cette mémoire, en commençant par 0 (l'adresse 226 correspond
donc au 227eme octets de la mémoire). Une adresse est donc un entier naturel codé comme indiqué au
paragraphe précédent. Les processeurs modernes sont capables de traiter des adresses sur 4 ou 8 octets
(pour les plus récents).
De ce fait, toute donnée peut être adressée (lue, écrite) directement en mémoire centrale: il suffit de
connaître l'adresse de son premier octet et le nombre d'octets occupés. De là vient la dénomination de
ce type de mémoire: Random Acces Memory (RAM), que l'on peut traduire littéralement par: mémoire à
accès aléatoire. En fait, il serait plus juste de dire «mémoire à ordre d'accès aléatoire» par opposition
à certains types de mémoire où l'on ne peut accéder aux données que dans un certain ordre (une bande
magnétique, par exemple).
L'octet correspond donc à une «case» de mémoire, au sens du modèle de Von Neuman. Les instructions ou les
données occupent toujours un ou plusieurs octets entiers (un nombre occupe 1, 2 , 4 ou 8 octets, un caractère
occupe 1 ou 2 octets suivant le codage choisi, un texte occupe un nombre entier d'octets.
III.3.3.TECHNOLOGIE DES MEMOIRES RAM:
III.3.3.1.MEMOIRES VIVES STATIQUES (S.R.A.M: Static RAM):
Ces mémoires sont très rapides et ont l'avantage de ne pas nécessiter de système de rafraîchissement,
car les bits sont mémorisés par des «circuits bistables». En revanche, elles sont très chères et
consomment beaucoup d'énergie. De ce fait, on les trouve surtout employées dans les mémoires caches
des processeurs: il n'est donc pas question d'employer une SRAM comme mémoire centrale.
III.3.3.2.MEMOIRES VIVES DYNAMIQUES:
PRINCIPE:
La plupart des mémoires R.A.M utilisées pour la mémoire centrale des ordinateurs sont des mémoires
«capacitives». Ce type de mémoire représente chaque bit par l'état d'un condensateur (en fait, on
utilise la capacité parasite qui existe, dans les transistors à effet de champ, entre le drain et
le substrat). Le condensateur peut être soit chargé, soit déchargé. L'état chargé correspond à la
valeur 1, l'état déchargé à la valeur 0.
Du fait des courants de fuite, la charge des capacités parasites représentant l'état des bits ne se
conserve que pendant quelques millisecondes. Il est donc nécessaire de rafraîchir constamment ces
charges par un mécanisme automatique. C'est ce qui explique le terme DYNAMIQUE appliqué à ces mémoires.
Malgré les contraintes dûes au rafraîchissement, ces mémoires sont peu coûteuses et consomment peu
d'énergie. De plus, chaque bit ne nécessite qu'une faible quantité de matière sur la puce électronique,
ce qui permet une grande densité d'intégration.
Les modules de mémoire dynamique sont reconnaîssables à la présence du sigle DRAM (Dynamic Read Only Memory)
dans leur appellation.
CARACTERISTIQUES:
Lorsqu'un processeur présente une requète de lecture ou d'écriture à un module mémoire, via le bus système,
il transmet dans un premier temps à ce module l'adresse mémoire à partir de laquelle la donnée est
implantée. Le fonctionnement du mécanisme d'adressage d'un module n'étant pas instantané, le module
n'accèdera à la donnée qu'après un certain TEMPS DE LATENCE, qui est, en général considérable par
rapport à la rapidité de fonctionnement d'un processeur. Pendant ce temps, le traitement sur le
processeur subira une période d'attente. De ce fait, le temps de latence des modules de la mémoire
vive est un facteur très important dans les performances d'un ordinateur.
En compensation, les mémoires de type DRAM et leurs évolutions possèdent un mode de lecture « en rafale »
(BURST en anglais), qui permet d'accèder aux 4 données consécutives situées à partir de l'adresse
spécifiée. De ce fait, l'accès aux trois dernières données ne subit pas de temps de latence.
Une autre caractéristique importante d'un module mémoire est la « largeur » (en nombre de bits) des
données qu'il est capable de transférer sur le bus système en une seule transmission. Actuellement,
la plupart des bus systèmes ont une largeur de données de 64 bits. La quasi-totalité des modules
mémoire actuels sont donc des « modules 64 bits ».
LES MEMOIRES DYNAMIQUES SYNCHRONES:
En ce qui concerne l'équipement des mémoires centrales d'ordinateurs, les modèles les plus utilisés
actuellement sont de type SDRAM (Synchronous Dynamic RAM). La particularité de ce type de modules
est que les échanges avec le processeur sont synchronisés par l'horloge interne de l'ordinateur,
alors que le fonctionnement des DRAM était asynchrone.
Cette synchronisation permet d'optimiser les délais d'attente du processeur lors d'un accès mémoire.
Les délais d'accès à la mémoire s'adaptent (jusqu'à une certaine limite) à la fréquence de fonctionnement
du processeur.
EVOLUTIONS DES MEMOIRES DYNAMIQUES SYNCHRONES:
- Les SDRAM (Synchronous Dynamic RAM) ne sont pratiquement plus utilisées sur les systèmes actuels.
D'une largeur de donnée de 32 bits, elles utilisaient un brochage de 72 broche (brochage SIMM: Simple
Inline Memory Module) que l'on ne trouve pratiquement plus sur les cartes mêres.
- les DDR SDRAM (Double Data Rate SDRAM), nettement plus rapides, transfèrent des données deux fois par
cycle d'horloge (d'où leur nom), avec une largeur de données de 64 bits. Elles sont destinées à des
supports d'enfichage de 184 broches (dits D.I.M.M. Double Inline Memory Module).
- Les DDR2, DDR3, DDR4 SDRAM, sont des évolutions des DDR SDRAM (amélioration des vitesses de transfer
et de la consommation électrique). Elles exigent des supports d'enfichage de 240 broches.
PERFORMANCES DES MEMOIRES DYNAMIQUES SYNCHRONES:
Les temps d'accès des premières DRAM étaient de l'ordre de 60 nanosecondes pour l'accès à une première donnée.
En ce qui concerne les DDR SDRAM le temps d'accès peut descendre un peu en dessous de 10 nanosecondes pour
l'accès à une première donnée.
La durée du cycle d'horloge d'un processeur fonctionnant à 3 giga-hertz étant de 0,333 nano-secondes, nous
pouvons voir que la rapidité d'accès à la mémoire reste un point de blocage important pour l'augmentation
des performances des ordinateurs. Equiper les systèmes de modules mémoires rapides constitue donc un
bon moyen d'améliorer les performances d'un ordinateur (à condition que le brochage soit compatible).
Cependant, le prix des modules augmente très rapidement avec leurs performances.
III.3.3.3.MODULES ET CONNECTEURS DE MEMOIRE:
Les modules de mémoire dynamique se présentent sous forme de cartes enfichables dans les connecteurs
du bus mémoire. Chacun de ces modules, appelés souvent «BARETTES MEMOIRE» à cause de leur forme allongée,
supportent, suivant leur type, 256, 512, 1024, 2048, etc. méga-octets.
Ces modules s'enfichent sur les connecteurs du BUS SYSTEME (Front Line Bus). Le format du brochage pour
les DDR est désigné par le sigle D.I.M.M (Dual Inline Memory Module), car les contacts sont répartis
sur les deux faces de la carte.
EXEMPLE:
III.4.3.COEUR DU PROCESSEUR:
III.4.3.1.DEFINITION:
Un COEUR de processeur désigne un sous-ensemble matériel du processeur capable d'assurer l'exécution
d'un THREAD LOGICIEL. Un processeur respectant strictement le modèle de Von Neuman est équipé d'un
seul coeur.
La notion de COEUR (CORE en anglais) est relativement récente. Au début des années 2000 sont apparus
des processeurs dits «MULTI-COEURS», se distinguant des précédents par leur capacité d'exécuter
plusieurs instructions en même temps (contrairement au modèle de Von Neuman). Ceci suppose donc que
ces processeurs soient équipés de plusieurs ensembles U.C + U.T. autonomes, qui sont ses coeurs.
III.4.3.2.CARACTERISTIQUES D'UN COEUR:
CAPACITE D'ADRESSAGE:
Une des caractéristiques principales d'un processeur est la dimension (en nombre de bits) des
adresses mémoires qu'il peut traiter. En effet, une adresse codée sur 4 octets (32 bits),
permet d'adresser un peu plus de 4 giga-octets: c'est la capacité des ordinateurs livrés
actuellement. Cette longueur d'adresse ne permet donc plus de progression de la capacité
mémoire. Les processeurs les plus récents traitent des adresses sur 8 octets, soit 64 bits,
ce qui leur permet d'adresser environ 18 milliards de milliards d'octets: ils n'introduisent
donc pratiquement plus de limitation (au moins à court ou moyen terme) à la capacité mémoire.
Cette caractéristique est surtout importante lorsque l'on désire effectuer des traitements
nécessitant de grands volumes de mémoire centrale (traitements photo et vidéo, par exemple).
LARGEUR DE MOT:
Nous avons vu plus haut que les processeurs étaient équipés de nombreux registres servant à
stocker les résultats intermédiaires des traitements, évitant ainsi des accès mémoires inutiles.
En général, les registres d'un processeur ont tous la même largeur L en nombre de bits, qui est
également la largeur des données binaires entières que l'Unité de Traitement peut
accepter. On dit alors que L est la largeur de MOT que le processeur peut traiter (en anglais,
cette notion de mot est souvent exprimée par le terme WORD, ou encore BYTE (qui n'est en aucun cas
la traduction d'octet).
La largeur du mot est importante car elle définit la précision des traitements numériques: avec
un mot de 16 bits, la précision est de l'ordre de 15 millionièmes, alors qu'elle atteint un
quart de milliardième avec 32 bits. Si la longueur de mot est insuffisante pour la précision
demandée, on est forcé, pour l'obtenir, d'avoir recours à des traitement logiciels supplémentaires
qui ralentissent les temps d'exécution. La longueur du mot influe donc sur la précision des calculs
ou sur la vitesse d'exécution.
Les premiers processeurs traitaient des mots de 8 ou 16 bits (1 ou 2 octets). Les processeurs
«32 bits» sont apparus au milieu des années 1990. Actuellement, les ordinateurs sont livrés avec
des processeurs «64 bits», mais de nombreux ordinateurs «32 bits» sont encore en service. La
plupart des systèmes d'exploitation et logiciels de service actuels sont programmés en 32 bits et
n'exploitent pas vraiment les possibilités des «64 bits».
EXECUTION D'UNE INSTRUCTION:
L'exécution d'une instruction par un coeur peut être décomposée en plusieurs étapes. La décomposition
la plus simple et la plus évidente comprend quatre étapes:
- La préparation de l'instruction (lecture en mémoire et décodage du code d'ordre).
- La préparation des données (lecture en mémoire des valeurs des opérandes).
- L'exécution (exécution de l'opération).
- La sauvegarde des résultats en mémoire.
(Cette décomposition n'est qu'un exemple simple: certains processeurs distinguent jusqu'à 14 étapes).
L'exécution de chaque étape est déclenchée par un signal périodique fourni par un composant appelé
HORLOGE INTERNE, indépendant du processus. C'est la fréquence de ce signal qui est évoquée lorsqu'on
parle, par exemple, d'un processeur de vitesse 3,3 ghz: ceci veut dire que chaque étape d'une
instruction est exécutée dans un intervalle de temps de 1/(3,3*109) secondes, soit environ 0,3
nano-secondes.
La durée d'exécution d'une instruction dépend donc de la période d'horloge et du nombre d'étapes.
Ainsi, une instruction comprenant 6 étapes sera exécutée en six «coups d'horloge». Dans l'exemple
précédent, une telle instruction s'exécuterait donc en 0,3*6 = 1,8 nano-secondes.
LIMITATIONS A L'AUGMENTATION DE LA FREQUENCE D'HORLOGE:
De ce qui précède, on pourrait déduire qu'il suffit d'augmenter la fréquence d'horloge pour augmenter
les performances d'un coeur. Pourtant, si cette opération (appelé OVERCLOCKING en anglais) peut constituer
un moyen d'améliorer la vitesse d'exécution des processeurs, elle se heurte à plusieurs difficultés:
- D'une part, la vitesse de commutation des circuits intégrés dépend surtout de leur miniaturisation.
Or, l'augmentation de celle-ci commence à poser des problèmes de réalisation.
- D'autre part, la dissipation d'énergie augmente beaucoup plus vite que la rapidité de commutation
des circuits. Les processeurs rapides exigent donc des dispositifs de refroidissement de plus
en plus complexes.
- Enfin, la vitesse d'exécution des étapes est souvent limitée par la vitesse des cycles de
lecture de la mémoire (nous verrons plus loin que ce point est amélioré par l'utilisation des
caches mémoires).
De ce fait, depuis quelques années, l'augmentation des vitesses d'horloge des processeurs «grand public»
semble marquer le pas (autour de 4 gigahertz).
NOTION DE PIPE-LINE:
La plupart des coeurs existants intègrent un mécanisme appelé PIPE LINE. Celui-ci consiste à concevoir
le coeur de façon à ce que chaque étape d'exécution d'une instruction utilise des circuits indépendants
des autres étapes. De ce fait, plusieurs étapes différentes de plusieurs instructions différentes peuvent
s'exécuter simultanément. Une instruction peut commencer à s'exécuter avant que l'instruction
précédente soit terminée.
EXEMPLE:
Supposons que les instructions s'exécutent suivant les 4 étapes énoncées ci-dessous. Nous pourrons avoir
un pipe-line de profondeur 4:
REMARQUE:
Le PIPE LINE doit disposer également d'un mécanisme permettant de lire «en avance» plusieurs
instructions (en fait, autant que la profondeur du pipe-line). Ce mécanisme, appelé BANQUE MEMOIRE
(MEMORY BANK) est souvent intégré aux CACHES que nous verrons plus loin.
L'efficacité du pipe line dépend de sa PROFONDEUR, c'est à dire du nombre d'étapes de différentes
instructions susceptibles de s'exécuter en même temps. Nous pouvons voir qu'en «régime établi»
(c'est à dire pendant l'exécution d'une longue série d'instruction séquencielles), un pipe-line
de profondeur N permet en théorie d'exécuter N fois plus d'instructions par unité de temps que
s'il n'y avait pas de pipe-line.
Le pipe-line permet donc, à fréquence d'horloge constante, d'augmenter le nombre d'instructions
exécutées par secondes, à condition que les instructions soient exécutées en séquence. En cas de
rupture de séquence, il n'est plus possible d'anticiper la lecture des instructions et le pipe-line
devient inopérant. L'efficacité dépend donc beaucoup de la structure du programme exécuté.
L'amélioration de vitesse par la solution «pipe-line» est près d'atteindre ses limites: d'une part,
certains processeurs modernes ont des pipe-lines de profondeur 14, ce qui augmente beaucoup la
complexité des coeurs, et d'autre part, les gains d'efficacité (qui en théorie sont de N pour
une profondeur N) s'amenuisent à mesure que la profondeur augmente, du fait des traitements
supplémentaires qu'entraine la gestion du pipe-line.
III.4.3.3.LES PROCESSEURS MULTI-COEURS:
Les processeurs MULTI-COEURS sont appelés ainsi car ils renferment plusieurs coeurs. Il est donc possible
d'exécuter simultanément plusieurs séquences d'instructions (qui se déroulent donc en parallèle dans le
temps). Ces séquences peuvent appartenir à un même programme ou à des programmes différents. Dans le
premier cas, on parle de «Multi-threading», dans le second de «multiprocessing». Il existe actuellement
sur le marché des processeurs à deux coeurs (exemple: pentium «Duo core» et «Duo core 2») et à 4 coeurs
(Exemple: Pentium quad).
Le schéma suivant décrit l'architecture de principe d'un processeur multicoeurs:
La solution multi-coeur doit, en théorie, permettre d'atteindre la même puissance qu'un simple-coeur en
utilisant des fréquences d'horloge plus faibles (4 fois pour un quadruple coeur), ce qui permet de
limiter les dissipations d'énergie. En fait, le gain en vitesse n'est pas aussi important. En effet:
- L'efficacité des multi-coeurs dépend de la possibilité de paralléliser les traitements des programmes
exécutés. Or, une bonne parallélisation des logiciels exige que ceux-ci soient codés d'une manière qui
permette leur division en «threads» parallélisables. La plupart des logiciels existants ne remplissent
pas ces conditions.
- Les multicoeurs possèdent tout de même des mécanismes permettant d'améliorer l'exécution de logiciels
non adaptés, par des algorithmes de parallélisation automatique, quand cela est possible. Cependant,
les gains obtenus restent relativement limités.
- Même si l'on se place dans le cas d'une parallélisation parfaite, le fonctionnement de plusieurs
coeurs sur la même puce induit forcément des temps d'attente dûs au partage de certaines ressources,
réduisant ainsi le rendement global, qui reste donc inférieur à la somme des rendements des coeurs.
Les coeurs des multicoeurs actuels (2010) ont des vitesses d'horloge situées autour de 1700 mhz, tandis
que les monocoeurs «grand public» les plus performants atteignent 3,5 à 4 mhz. Dans ces conditions,
les améliorations se situent plus au niveau de la dissipation d'énergie (critère important quand il
s'agit d'un ordinateur portable) plutôt que de la vitesse d'exécution.
Actuellement (2010), la mise sur le marché de logiciels adaptés au traitement multi-coeurs est encore
assez réduite. En effet, peu de développeurs sont formés à ce type de programmation. La situation va
très probablement s'améliorer, au moins à moyen terme, sous la pression de la demande car la plupart
des ordinateurs actuellement mis sur le marché sont équipés de multicoeurs.
REMARQUE:
Une machine dotée d'un processeur multicoeur n'est pas équivalente à une machine multi-processeurs: sur
une machine multi-coeur, le processeur cherche à paralléliser l'exécution du code de chaque programme,
alors qu'une machine multiprocesseurs attribue à chaque processeur un programme différent et les exécute
simultanément.
En général, sur une machine à multiprocesseurs, un processeur est dédié au système d'exploitation et les
autres aux programmes d'application. Ces logiciels peuvent être écrits de façon classique (linéaire).
III.4.4.LES MEMOIRES CACHES (ANTEMEMOIRE):
III.4.4.1.PRINCIPE:
Les MEMOIRES CACHES sont constituées de mémoires rapides, souvent de technologie SRAM, qui fonctionnent
suivant un mécanisme différent des RAM classiques: L'accès aux données ne se fait pas par une adresse
numérique, mais par une «clef d'identification» à laquelle la donnée est associée (d'où le nom de MEMOIRE
ASSOCIATIVE). Ces mémoires à accès ultra-rapide sont en compensation très coûteuses et gourmandes en
énergie. Il n'est donc pas question d'en installer de grandes capacités.
Le principe des mémoires caches est de mémoriser des données en provenance de la mémoire centrale au fur et à
mesure qu'elles sont utilisées par le processeur afin de pouvoir, en cas de nouvelle demande d'accès à ces
données, les fournir directement au processeur sans qu'il soit nécessaire de refaire une lecture en mémoire
centrale.
Le schéma suivant décrit le mécanisme de principe d'un cache:
COMMENTAIRE:
- Le processeur a besoin de la donnée D. Il la demande au cache.
- Celui-ci ne l'a pas encore mémorisée. Le cache lit alors en mémoire centrale la donnée D plus
les données voisines.
- Le cache fournit alors la donnée D au processus.
- Si, quelques temps après, le processeur a besoin d'une donnée, il en fait la demande au cache.
- Celui-ci recherche cette donnée parmi celles qu'il a enregistrées. Si cette donnée fait
partie du bloc enregistré avec D, il la fournit directement au processeur. Sinon, il la lit
en mémoire centrale avec les données voisines, puis la fournit au processeur après avoir
mémorisé les données lues.
D'autre part:
- Lorsque le processus écrit une donnée en mémoire, le cache en profite pour rafraîchir cette
donnée s'il la possède.
- Lorsqu'un équipement quelconque écrit directement en mémoire sans passer par le processeur,
le cache en est averti et peut se mettre à jour.
III.4.4.2.NIVEAUX DE CACHES:
Le schéma de processeur présenté plus haut montre un système à deux niveaux de caches:
- Un cache «primaire» (que l'on note L1), divisé en deux mémoires distinctes: un cache d'instructions
et un cache de données. Le cache L1 est relativement petit (quelques dizaines de méga-octets).
- Un cache secondaire, noté L2, beaucoup plus grand.
Le principe de fonctionnement reste sensiblement le même qu'avec un seul cache. Le cache L2 se comportant
vis à vis de L1 comme L1 se comporte vis à vis du processeur.
REMARQUE: Certains processeurs modernes intègrent un troisième niveau de cache, appelé «cache externe».
Ce cache externe peut aussi être connecté au Front Side Bus.
III.4.4.3.UTILITE DES MEMOIRES CACHES:
L'intérêt des mémoires caches est évident en ce qui concerne la lecture des instructions en mémoire:
celles-ci étant la plupart du temps exécutées en séquence, il est intéressant, quand on en lit une, de
lire également les N instructions qui suivent en mémoire et de les placer dans le cache: on ne
fera alors plus qu'un accès mémoire toutes les N instructions, le reste étant lu en mémoire rapide.
Le regroupement des instructions d'un même programme dans une zone mémoire peut également permettre
de charger toutes ses instructions dans le cache. L'efficacité du cache est alors maximale.
En ce qui concerne la lecture des données, l'efficacité des caches dépend de la manière dont les zones
de données des programmes sont organisées en mémoire: une organisation qui permet d'amener le maximum
de données dans le cache sera optimale.
La manière d'assembler les programmes en mémoire influe donc beaucoup sur l'efficacité des caches.
Celle-ci dépend de la qualité des développeurs, mais aussi de celle des compilateurs. Elle dépend également
de la taille des caches et des performences des mémoires utilisées.